package com.fy.fyspace;

import com.fy.fyspace.common.utils.AiUtils;
import com.zhipu.oapi.service.v4.model.ModelData;
import io.reactivex.Flowable;
import io.reactivex.schedulers.Schedulers;
import lombok.extern.slf4j.Slf4j;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@SpringBootTest
public class test1 {

    public SseEmitter generateQuestionSSE(String prompt) {
        // 建立 SSE 连接对象，0 表示不超时
        SseEmitter emitter = new SseEmitter(0L);
        // AI 生成的流式响应结果
        Flowable<ModelData> modelDataFlowable = AiUtils.aiCallerFlow(prompt);

        modelDataFlowable
                // 指定观察者的线程池
                .observeOn(Schedulers.io())
                // 从智谱的响应中获取数据
                .map(chunk -> chunk.getChoices().get(0).getDelta().getContent())
                // 去掉响应中多余的空格
                .map(message -> message.replaceAll("\\s", ""))
                // 去掉为空字符串的响应
                .filter(StringUtils::isNotBlank)
                .flatMap(message -> {
                    // 将字符串转换为字符数组以便后续业务处理
                    List<Character> charList = new ArrayList<>();
                    for (char c : message.toCharArray()) {
                        charList.add(c);
                    }
                    return Flowable.fromIterable(charList);
                })
                .doOnNext(c -> {
                    // 进行业务处理
                    // 然后发送结果，这里为了演示直接不进行处理将给一个字符c都全部如实发送
                    emitter.send(c);
                })
                //当AI响应完毕时关闭SSE
                .doOnComplete(emitter::complete)
                // 订阅AI响应流
                .subscribe();
        return emitter;
    }

}